﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Web;
using Framework.Library.Core.Config;
using Framework.Library.Core.Provider.Caches;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.Practices.EnterpriseLibrary.Caching;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
using Framework.Library.Core.Provider.Log;
using Framework.Library.Core.Utils.IO;
using Framework.Library.Core.Utils;

namespace Framework.Library.Core.Provider.Caches
{
    //public class CacheFile : ICaching
    //{
    //    private static CacheFile instance = new CacheFile();
    //    Serializer<Hashtable> serializer = new Serializer<Hashtable>();
    //    string resources = HttpContext.Current.Server.MapPath(Configurations.CachePath);
        
    //    public static CacheFile Instance
    //    {
    //        get { return instance; }
    //    }

    //    public object GetHashCache(string hashKey, string param)
    //    {
    //        if (Directory.Exists(resources))
    //        {
    //            FileInfo[] lstCache = new DirectoryInfo(resources).GetFiles();
    //            if (lstCache.Length > 0)
    //            {
    //                foreach (FileInfo file in lstCache)
    //                {
    //                    if (file.Name.IndexOf(hashKey) > -1)
    //                    {
    //                        string[] arrCacheFile = file.Name.Split('.');
    //                        if (arrCacheFile.Length > 1)
    //                        {
    //                            double currentTime = ConvertUtility.ToUnixTime(DateTime.Now);
    //                            if (currentTime <= Convert.ToDouble(arrCacheFile[1]))
    //                            {
    //                                param = param.GetHashCode().ToString();
    //                                var retVal = (Hashtable)serializer.DeSerializeObject(resources + file.Name);
    //                                if (retVal != null)
    //                                {
    //                                    if (retVal[param] != null)
    //                                        return retVal[param];
    //                                }
    //                            }
    //                        }
    //                    }
    //                }
    //            }
    //        }
    //        return null;
            
    //    }

    //    public Hashtable GetHashCache(string hashKey, out string filePath)
    //    {
    //        if (Directory.Exists(resources))
    //        {
    //            FileInfo[] lstCache = new DirectoryInfo(resources).GetFiles();
    //            if (lstCache.Length > 0)
    //            {
    //                foreach (FileInfo file in lstCache)
    //                {
    //                    if (file.Name.IndexOf(hashKey) > -1)
    //                    {
    //                        string[] arrCacheFile = file.Name.Split('.');
    //                        if (arrCacheFile.Length > 1)
    //                        {
    //                            double currentTime = ConvertUtility.ToUnixTime(DateTime.Now);
    //                            if (currentTime <= Convert.ToDouble(arrCacheFile[1]))
    //                            {
    //                                var retVal = (Hashtable)serializer.DeSerializeObject(resources + file.Name);
    //                                filePath = file.Name;
    //                                if (retVal != null)
    //                                    return retVal;
    //                            }
    //                        }                            
    //                    }
    //                }
    //            }
    //        }
    //        filePath = string.Empty;
    //        return null;
    //    }

    //    public void SetHashCache(string hashKey, string param, object data)
    //    {
    //        SetHashCache(hashKey, param, data, Convert.ToInt32(Configurations.CacheExpire));
    //    }

    //    public void SetHashCache(string hashKey, string param, object data, int expireTime)
    //    {
    //        string paramHC = param.GetHashCode().ToString();
    //        string filePath = string.Empty;
    //        var retVal = GetHashCache(hashKey, out filePath);            
    //        if (retVal == null)
    //        {
    //            retVal = new Hashtable();
    //            retVal[paramHC] = data;
    //            serializer.SerializeObject(resources + hashKey + "." + ConvertUtility.ToUnixTime(DateTime.Now.AddHours(expireTime)), retVal);            
    //        }
    //        else
    //        {
    //            if (retVal.ContainsKey(paramHC))
    //                retVal[paramHC] = data;
    //            else
    //                retVal.Add(paramHC, data);
    //            serializer.SerializeObject(resources + filePath, retVal);            
    //        }            
    //    }

    //    public void RemoveCache(string hashKey)
    //    {
    //        if (File.Exists(resources + hashKey))
    //            File.Delete(resources + hashKey);
    //    }

    //    public void RemoveAll()
    //    {
    //        string[] lstFile = Directory.GetFiles(resources);
    //        if (lstFile.Length > 0)
    //        {
    //            foreach (string fileName in lstFile)
    //            {
    //                File.Delete(fileName);
    //            }
    //        }
    //    }
    //}
}
